package com.object.bases;




/*
## 定义方法
    修饰符 方法返回类型 方法名(方法参数列表) {
        若干方法语句;
        return 方法返回值;
    }

    方法返回值通过return语句实现，如果没有返回值，返回类型设置为void，可以省略return。

## private方法
    有public方法，自然就有private方法。和private字段一样，private方法不允许外部调用，那我们定义private方法有什么用？
    定义private方法的理由是内部方法是可以调用private方法的。

## this 变量
    在方法内部，可以使用一个隐含的变量this，它始终指向当前实例。因此，通过this.field就可以访问当前实例的字段。
    如果没有命名冲突，可以省略this。
    但是，如果有局部变量和字段重名，那么局部变量优先级更高，就必须加上this

## 方法参数
    方法可以包含0个或任意个参数。方法参数用于接收传递给方法的变量值。调用方法时，必须严格按照参数的定义一一传递。

## 可变参数
    可变参数用类型...定义，可变参数相当于数组类型
## 参数绑定
    调用方把参数传递给实例方法时，调用时传递的值会按参数位置一一绑定。
    结论：引用类型参数的传递，调用方的变量，和接收方的参数变量，指向的是同一个对象。双方任意一方对这个对象的修改，都会影响对方（因为指向同一个对象嘛）。
    结论：基本类型参数的传递，是调用方值的复制。双方各自的后续修改，互不影响。


##  小结
    方法可以让外部代码安全地访问实例字段；
    方法是一组执行语句，并且可以执行任意逻辑；
    方法内部遇到return时返回，void表示不返回任何值（注意和返回null不同）；
    外部代码通过public方法操作实例，内部代码可以调用private方法；
    理解方法的参数绑定。
 */

public class MethodStu {
    public static void main(String[] args) {
        Person1 p = new Person1();
        int n = 15; // n的值为15
        p.setAge(n); // 传入n的值
        System.out.println(p.getAge()); // 15
        n = 20; // n的值改为20
        System.out.println(p.getAge()); // 15还是20?

        Person2 p1 = new Person2();
        String[] fullname = new String[] { "Homer", "Simpson" };
        p1.setName(fullname); // 传入fullname数组
        System.out.println(p1.getName()); // "Homer Simpson"
        fullname[0] = "Bart"; // fullname数组的第一个元素修改为"Bart"
        System.out.println(p1.getName()); // "Homer Simpson"还是"Bart Simpson"?
    }
}

//this
class Person {
    private String name;

    public String getName() {
        return name; // 相当于this.name
    }
}

//可变参数
class Group {
    private String[] names;

    public void setNames(String... names) {
        this.names = names;
    }
}

//基本类型参数绑定
class Person1 {
    private int age;

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

//引用类型参数绑定
class Person2 {
    private String[] name;

    public String getName() {
        return this.name[0] + " " + this.name[1];
    }

    public void setName(String[] name) {
        this.name = name;
    }
}
